home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork2.lzh / サンプル基礎編 / エラーダイアログ / EDIALOG.C next >
Text File  |  1994-03-10  |  18KB  |  504 lines

  1. /******************************************************************************
  2.  *    edialog.c:    エラーダイアログの表示
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  *
  6.  *    機能説明:
  7.  *    このプログラムは、DMErrorを使って様々なエラーダイアログの表示を行いま
  8.  *    す。
  9.  *
  10.  *    使用方法:
  11.  *    エラーダイアログ.xを起動して、そのウインドウ内でマウスの右ボタンを押し、
  12.  *    ポップアップメニューからエラーダイアログの種類を選択します。
  13.  *    ウィンドウ上の[実行]ボタンを押すと、指定のエラーダイアログが表示されま
  14.  *    す。
  15.  */
  16. #include <ctype.h>
  17. #include <string.h>
  18. #include <stdlib.h>
  19. #include <sxmemory.h>        /* メモリマンを利用するときに必要    */
  20. #include <event.h>        /* イベントマンを利用するときに必要    */
  21. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  22. #include <window.h>        /* ウィンドウマンを利用するときに必要    */
  23. #include <menu.h>        /* メニューマンを利用するときに必要    */
  24. #include <control.h>        /* コントロールマンを利用するときに必要    */
  25. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  26. #include <task.h>        /* タスクマンを利用するときに必要    */
  27. #include "edialog.h"        /* このプログラム固有のヘッダファイル    */
  28.  
  29. char _sxkernelcomm[] = SXKERNEL;    /* カーネル起動コマンド        */
  30.  
  31. /******************************************************************************
  32.  *    main():        メイン関数
  33.  ******************************************************************************
  34.  */
  35. int main(void)
  36. {
  37.     ComVal cv;            /* 共通変数            */
  38.  
  39.     if (!init(&cv)) {        /* 初期化処理を行う        */
  40.         showErrDialog(&cv);    /* エラーダイアログを表示する    */
  41.         cv.endFlag = TRUE;    /* 終了フラグをセットする    */
  42.     }
  43.     /* 終了フラグがセットされるまでループする */
  44.     while (!cv.endFlag) {
  45.         cv.errorCode = 0;    /* エラーコードをクリアする    */
  46.         /* タスクマンからイベントを取得する */
  47.         TSEventAvail(cv.eventMask, &cv.event);
  48.         /* 各イベントに対応した処理を行う */
  49.         switch (cv.event.ts.what) {
  50.         case E_MSLDOWN:        /* マウスレフトダウンイベント    */
  51.             msLDownEvent(&cv);
  52.             break;
  53.         case E_MSRDOWN:        /* マウスライトダウンイベント    */
  54.             msRDownEvent(&cv);
  55.             break;
  56.         case E_KEYDOWN:        /* キーダウンイベント        */
  57.             keyDownEvent(&cv);
  58.             break;
  59.         case E_UPDATE:        /* アップデートイベント        */
  60.             updateEvent(&cv);
  61.             break;
  62.         case E_ACTIVATE:    /* アクティベートイベント    */
  63.             activateEvent(&cv);
  64.             break;
  65.         case E_SYSTEM1:        /* システムイベント        */
  66.         case E_SYSTEM2:
  67.             systemEvent(&cv);
  68.             break;
  69.         }
  70.         if (cv.errorCode != 0)    /* エラーが発生したか?        */
  71.             showErrDialog(&cv); /* エラーダイアログを表示する */
  72.     }
  73.     /* 終了手続きを行う */
  74.     endProc(((cv.errorCode == 0) ? EXIT_SUCCESS : EXIT_FAILURE), &cv);
  75.  
  76.     return 0;
  77. }
  78.  
  79. /******************************************************************************
  80.  *    init():        初期化処理
  81.  ******************************************************************************
  82.  *    引数:    ComVal *pcv    共通変数へのポインタ
  83.  *    戻り値:    BOOLEAN        = TRUE:  初期化成功
  84.  *                = FALSE: 初期化失敗(終了)
  85.  *    注釈:    共通変数の初期化、アボート処理関数の登録、ウィンドウの作成と
  86.  *        表示などを行う。
  87.  */
  88. BOOLEAN init(ComVal *pcv)
  89. {
  90.     pcv->windowPtr = NULL;        /* ウィンドウポインタ        */
  91.     pcv->activeFlag = FALSE;    /* アクティブフラグ        */
  92.     pcv->eventMask = EVENTMASK;    /* イベントマスク        */
  93.     pcv->errorCode = 0;        /* エラーコード            */
  94.     pcv->endFlag = FALSE;        /* 終了フラグ            */
  95.     pcv->chrBtnHdl = NULL;        /* 文字ボタンのコントロールハンドル */
  96.     pcv->lastMenu = 1;        /* 前回選択したメニュー番号    */
  97.  
  98.     TSSetAbort(endProc, (long) pcv); /* アボート処理関数を登録する    */
  99.  
  100.     if (LOWWORD(SXVer()) < SXVER2) { /* SXシステムのバージョンを調べる */
  101.         pcv->errorCode = 1;    /* バージョン2より古い        */
  102.         return FALSE;        /* 失敗したのでFALSEを返す    */
  103.     }
  104.     if (!createWindow(pcv)) {    /* ウィンドウを作成する        */
  105.         pcv->errorCode = 2;    /* 作成できなかった        */
  106.         return FALSE;        /* 失敗したのでFALSEを返す    */
  107.     }
  108.  
  109.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  110.     GMForeColor(G_BLACK);        /* フォアグラウンドカラーを黒にする */
  111.     /* バックグラウンドカラーをライトグレーにする */
  112.     GMBackColor(G_LGRAY);
  113.  
  114.     if (!createControl(pcv)) {    /* コントロールを作成する    */
  115.         pcv->errorCode = 3;    /* 作成できなかった        */
  116.         return FALSE;        /* 失敗したのでFALSEを返す    */
  117.     }
  118.  
  119.     WMShow(pcv->windowPtr);        /* ウィンドウを表示する        */
  120.     return TRUE;            /* 成功したのでTRUEを返す    */
  121. }
  122.  
  123. /******************************************************************************
  124.  *    createWindow():    ウィンドウの作成
  125.  ******************************************************************************
  126.  *    引数:    ComVal *pcv    共通変数へのポインタ
  127.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  128.  *                = FALSE: 作成失敗(終了)
  129.  */
  130. BOOLEAN createWindow(ComVal *pcv)
  131. {
  132.     int paramFlags;            /* パラメータの有無        */
  133.     Rect rc;
  134.     Task task;            /* タスク管理レコード        */
  135.  
  136.     static Rect winSize = { 0, 0, WIN_H, WIN_V }; /* ウィンドウサイズ */
  137.  
  138.     TSGetTdb(&task, TS_OWN);    /* タスク管理レコードを取得する    */
  139.     paramFlags = TSTakeParam(    /* コマンドラインを解析する    */
  140.         task.command,        /* コマンドライン        */
  141.         &rc,            /* 指定されたウィンドウ位置    */
  142.         NULL,            /* 最終文字列を格納しない    */
  143.         0,            /* アドレステーブルを保存しない    */
  144.         NULL,            /* アドレステーブルを作成しない    */
  145.         NULL);            /* ポインタを確保しない        */
  146.     if (!(paramFlags & 1)) {    /* ウィンドウ位置の指定があるか? */
  147.         /* ない場合、システムからウィンドウの左上座標を取得する */
  148.         rc = winSize;
  149.         GMSlideRect(&rc, TSGetWindowPos());
  150.     }
  151.  
  152.     pcv->windowPtr = WMOpen(    /* ウィンドウをオープンする    */
  153.         NULL,            /* ウィンドウポインタを確保する    */
  154.         &rc,            /* ウィンドウの表示位置        */
  155.         WINTITLE,        /* ウィンドウタイトル        */
  156.         FALSE,            /* オープン時に描画しない    */
  157.         WI_STD2 << 4,        /* タイトルの広い標準ウィンドウ    */
  158.         W_FRONT,        /* 一番手前に表示する        */
  159.         TRUE,            /* クローズボタンを使用する    */
  160.         TSGetID());        /* 自分のタスクID        */
  161.     if (pcv->windowPtr == NULL)
  162.         return FALSE;        /* 失敗したのでFALSEを返す    */
  163.  
  164.     return TRUE;            /* 成功したのでTRUEを返す    */
  165. }
  166.  
  167. /******************************************************************************
  168.  *    createControl():    コントロールの作成
  169.  ******************************************************************************
  170.  *    引数:    ComVal *pcv    共通変数へのポインタ
  171.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  172.  *                = FALSE: 作成失敗(終了)
  173.  */
  174. BOOLEAN createControl(ComVal *pcv)
  175. {
  176.     static Rect bounds = {        /* 文字ボタンの位置と大きさ    */
  177.         CHR_X, CHR_Y, CHR_X + CHRBTN_H + 12 * 2, CHR_Y + CHRBTN_V
  178.     };
  179.  
  180.     pcv->chrBtnHdl = CMOpen(    /* 文字ボタンを作成する        */
  181.         pcv->windowPtr,        /* ウィンドウポインタ        */
  182.         &bounds,        /* 描画する位置と大きさ        */
  183.         (_LASCII)"\x04実行",    /* 文字ボタンのタイトル        */
  184.         TRUE,            /* 描画許可フラグ        */
  185.         0,            /* コントロールの初期値        */
  186.         0,            /* コントロールの最小値        */
  187.         1,            /* コントロールの最大値        */
  188.         CI_CHRBTN << 4,        /* 文字ボタンのリソースID×16    */
  189.         0);            /* ユーザーの初期値        */
  190.     if (pcv->chrBtnHdl == NULL)
  191.         return FALSE;        /* 失敗したのでFALSEを返す    */
  192.  
  193.     return TRUE;            /* 成功したのでTRUEを返す    */
  194. }
  195.  
  196. /******************************************************************************
  197.  *    msLDownEvent():    マウスレフトダウンイベント処理
  198.  ******************************************************************************
  199.  *    引数:    ComVal *pcv    共通変数へのポインタ
  200.  *    注釈:
  201.  *    ウィンドウ上でマウスの左ボタンが押された場合の処理を行う。
  202.  *    この処理でクローズボタンによる終了、ウィンドウの移動が可能となります。
  203.  */
  204. void msLDownEvent(ComVal *pcv)
  205. {
  206.     int partCode;            /* ウィンドウのパートコード    */
  207.     Window *wTemp;            /* テンポラリウィンドウポインタ    */
  208.  
  209.     /* イベントが自分のウィンドウか? */
  210.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  211.         /* ウィンドウがインアクティブで、OPT.1キーが押されてないか? */
  212.         if (!pcv->activeFlag && !(pcv->event.ev.how & KS_OPT1)) {
  213.             /* ウィンドウをアクティブにする */
  214.             WMSelect(pcv->windowPtr);
  215.             /* ボタンが押された場所のパートコードを取得する */
  216.             partCode = WMFind(pcv->event.ev.where.x_y, &wTemp);
  217.             /* タイトルバー以外か、左ボタンが離されたか? */
  218.             if (partCode != W_INDRAG || !EMLStill())
  219.                 return;
  220.         }
  221.         /* マウスのボタンが押されている間、ウィンドウ上の各種処理を
  222.            システムに任せて、ボタンが押された、または離された場所の
  223.            パートコードを取得する */
  224.         partCode = SXCallWindM(pcv->windowPtr, &pcv->event);
  225.         switch (partCode) {
  226.         case W_INCLOSE:        /* クローズボタン        */
  227.             pcv->endFlag = TRUE; /* 終了フラグをセットする    */
  228.             break;
  229.         case W_ININSIDE:    /* ウィンドウの内側        */
  230.             checkControl(pcv); /* コントロールをチェックする */
  231.             break;
  232.         }
  233.     }
  234. }
  235.  
  236. /******************************************************************************
  237.  *    checkControl():    コントロールのチェック
  238.  ******************************************************************************
  239.  *    引数:    ComVal *pcv    共通変数へのポインタ
  240.  */
  241. void checkControl(ComVal *pcv)
  242. {
  243.     int partCode;            /* コントロールのパートコード    */
  244.     Control **ctrlHdl;        /* コントロールハンドル        */
  245.  
  246.     /* マウスのボタンが押されている間、コントロールの各種処理をシステムに
  247.        任せて、コントロールハンドルとボタンが押された、または離された場所
  248.        のパートコードを取得する */
  249.     partCode = SXCallCtrlM(pcv->windowPtr, &pcv->event, 0, 0, NULL, &ctrlHdl);
  250.     /* 文字ボタンで、ハンドルも一致した? */
  251.     if (partCode == C_INBTTN && ctrlHdl == pcv->chrBtnHdl)
  252.         /* エラーダイアログの例を表示する */
  253.         exampleError(pcv);
  254. }
  255.  
  256. /******************************************************************************
  257.  *    msRDownEvent():    マウスライトダウンイベント処理
  258.  ******************************************************************************
  259.  *    引数:    ComVal *pcv    共通変数へのポインタ
  260.  *    注釈:    ウィンドウ上でマウスの右ボタンが押された場合の処理を行う。
  261.  */
  262. void msRDownEvent(ComVal *pcv)
  263. {
  264.     /* イベントが自分のウィンドウで、
  265.        ウィンドウがアクティブか、OPT.1キーが押されたか? */
  266.     if (pcv->event.ev.whom.win == pcv->windowPtr
  267.      && (pcv->activeFlag || pcv->event.ev.how & KS_OPT1))
  268.         selectMenu(pcv);    /* メニューの作成と選択処理を行う */
  269. }
  270.  
  271. /******************************************************************************
  272.  *    selectMenu():    ポップアップメニューの作成と選択処理
  273.  ******************************************************************************
  274.  *    引数:    ComVal *pcv    共通変数へのポインタ
  275.  */
  276. void selectMenu(ComVal *pcv)
  277. {
  278.     int i;
  279.     int num;            /* メニューのアイテム番号    */
  280.     Menu **menuHdl;            /* メニューハンドル        */
  281.     char str[256];
  282.  
  283.     static char *menuItem[7] = {    /* メニューアイテム        */
  284.         "イエローフラッグ,",
  285.         "レッドフラッグ,",
  286.         "はい/いいえ,",
  287.         "保存/終了,",
  288.         "実行/取消,",
  289.         "継続/中止,",
  290.         "タスク名付き"
  291.     };
  292.  
  293.     /* メニュー定義文字列の作成 */
  294.     str[0] = 0;
  295.     for (i = 0; i < 7; i++) {
  296.         if (i == pcv->lastMenu - 1)
  297.             strcat(str, "!"); /* チェックマークを表示する    */
  298.         strcat(str, menuItem[i]);
  299.     }
  300.     menuHdl = MNConvert(        /* メニューを作成する        */
  301.         NULL,            /* メニューハンドルを確保する    */
  302.         str,            /* メニュー定義文字列        */
  303.         MI_PLN);        /* タイトル無しのリソースID    */
  304.     if (menuHdl == NULL) {
  305.         pcv->errorCode = 6;    /* 作成できなかった        */
  306.         pcv->endFlag = TRUE;    /* 終了フラグをセットする    */
  307.         return;
  308.     }
  309.     /* メニューの表示と選択を行う */
  310.     num = MNSelect(            /* メニューの表示と選択を行う    */
  311.         menuHdl,        /* メニューハンドル        */
  312.         pcv->event.ev.where.x_y); /* マウスの右ボタンが押された位置 */
  313.     MMHdlDispose(menuHdl);        /* メニューハンドルを解放する    */
  314.     switch (num) {
  315.     case 1:                /* イエローフラッグ        */
  316.     case 2:                /* レッドフラッグ        */
  317.     case 3:                /* はい/いいえ            */
  318.     case 4:                /* 保存/終了            */
  319.     case 5:                /* 実行/取消            */
  320.     case 6:                /* 継続/中止            */
  321.     case 7:                /* タスク名付き            */
  322.         pcv->lastMenu = num;    /* 選択されたアイテム番号を保存する */
  323.         break;
  324.     }
  325. }
  326.  
  327. /******************************************************************************
  328.  *    keyDownEvent():    キーダウンイベント処理
  329.  ******************************************************************************
  330.  *    引数:    ComVal *pcv    共通変数へのポインタ
  331.  *    注釈:    OPT.1+'Q'キーでの終了処理を行う。
  332.  */
  333. void keyDownEvent(ComVal *pcv)
  334. {
  335.     int shortCut;            /* ショートカットキー        */
  336.  
  337.     if (pcv->event.ev.how & KS_OPT1) { /* OPT.1キーが押されたか?    */
  338.         /* キー入力した文字を大文字に変換する */
  339.         shortCut = toupper((int) pcv->event.ev.whom.key.ascii);
  340.         if (shortCut == 'Q')    /* 終了か?            */
  341.             pcv->endFlag = TRUE; /* 終了フラグをセットする    */
  342.     }
  343. }
  344.  
  345. /******************************************************************************
  346.  *    updateEvent():    アップデート処理
  347.  ******************************************************************************
  348.  *    引数:    ComVal *pcv    共通変数へのポインタ
  349.  *    注釈:
  350.  *    アップデート処理としてウィンドウ内部を描画する。
  351.  *    この処理を行わないと、自分より下のウィンドウのアップデートやアイドル
  352.  *    イベントの処理ができなくなります。
  353.  */
  354. void updateEvent(ComVal *pcv)
  355. {
  356.     /* イベントが自分のウィンドウか? */
  357.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  358.         WMUpdate(pcv->windowPtr); /* アップデートを開始する    */
  359.         drawGraph(pcv);        /* ウィンドウ内部を描画する    */
  360.         WMUpdtOver(pcv->windowPtr); /* アップデートを終了する    */
  361.     }
  362. }
  363.  
  364. /******************************************************************************
  365.  *    drawGraph():    ウィンドウ内部の描画
  366.  ******************************************************************************
  367.  *    引数:    ComVal *pcv    共通変数へのポインタ
  368.  */
  369. void drawGraph(ComVal *pcv)
  370. {
  371.     CMDraw(pcv->windowPtr);        /* すべてのコントロールを描画する */
  372. }
  373.  
  374. /******************************************************************************
  375.  *    activateEvent():    アクティベートイベント処理
  376.  ******************************************************************************
  377.  *    引数:    ComVal *pcv    共通変数へのポインタ
  378.  *    注釈:    アクティブ、インアクティブによるアクティブフラグの切り替えと、
  379.  *        イベントマスクの切り替えを行う。
  380.  */
  381. void activateEvent(ComVal *pcv)
  382. {
  383.     /* イベントが自分のウィンドウか? */
  384.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  385.         pcv->activeFlag = TRUE;    /* アクティブフラグをセットする    */
  386.         /* アクティブ時のイベントマスクをセットする */
  387.         pcv->eventMask = EVENTMASK | EM_KEYDOWN;
  388.     /* イベントが他のウィンドウで、自分がアクティブ状態か? */
  389.     } else if (pcv->activeFlag) {
  390.         pcv->activeFlag = FALSE; /* アクティブフラグをクリアする */
  391.         /* インアクティブ時のイベントマスクをセットする */
  392.         pcv->eventMask = EVENTMASK;
  393.     }
  394. }
  395.  
  396. /******************************************************************************
  397.  *    systemEvent():    システムイベント処理
  398.  ******************************************************************************
  399.  *    引数:    ComVal *pcv    共通変数へのポインタ
  400.  *    注釈:    全ウィンドウのクローズ、全タスクの終了、ウィンドウのセレクトに
  401.  *        対応した処理を行う。
  402.  */
  403. void systemEvent(ComVal *pcv)
  404. {
  405.     switch (pcv->event.ts.what2) {    /* イベントの種類は?        */
  406.     case CLOSEALL:            /* 全ウィンドウのクローズ    */
  407.     case ENDTSK:            /* 全タスクの終了        */
  408.         pcv->endFlag = TRUE;    /* 終了フラグをセットする    */
  409.         break;
  410.     case WINDOWSELECT:        /* ウィンドウのセレクト        */
  411.         WMSelect(pcv->windowPtr); /* ウィンドウをアクティブにする */
  412.         break;
  413.     }
  414. }
  415.  
  416. /******************************************************************************
  417.  *    showErrDialog():    エラーダイアログの表示
  418.  ******************************************************************************
  419.  *    引数:    ComVal *pcv    共通変数へのポインタ
  420.  */
  421. void showErrDialog(ComVal *pcv)
  422. {
  423.     int i;
  424.  
  425.     static struct {            /* エラー情報            */
  426.         int code;        /* エラーコード            */
  427.         int manager;        /* 使用するマネージャ        */
  428.         int flag;        /* 表示フラッグ            */
  429.         char *message;        /* エラーメッセージ        */
  430.     } errInfo[] = {
  431.         { 1, 1, D_RED,    "SX SYSTEMのバージョンが違います。" },
  432.         { 2, 2, D_RED,    "ウィンドウが作成できません。" },
  433.         { 3, 2, D_RED,    "コントロールが作成できません。" },
  434.         { 6, 1, D_RED,    "メニューが作成できません。" },
  435.         { 0, 1, D_YELLOW, "エラーが発生しました。" }
  436.     };
  437.  
  438.     for (i = 0; errInfo[i].code != 0; i++) /* エラーコードを捜す    */
  439.         if (errInfo[i].code == pcv->errorCode)
  440.             break;
  441.     switch (errInfo[i].manager) {    /* マネージャの選択        */
  442.     case 1:                /* ダイアログマン        */
  443.         DMError(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
  444.         break;
  445.     case 2:                /* タスクマン            */
  446.         TSErrDialogN(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
  447.         break;
  448.     }
  449. }
  450.  
  451. /******************************************************************************
  452.  *    endProc():    終了手続き
  453.  ******************************************************************************
  454.  *    引数:    int code    終了コード
  455.  *        ComVal *pcv    共通変数へのポインタ
  456.  *    注釈:    ハンドルの解放やウィンドウの廃棄と、プログラムの終了を行う。
  457.  */
  458. void endProc(int code, ComVal *pcv)
  459. {
  460.     /* ウィンドウポインタが確保されたままか? */
  461.     if (pcv->windowPtr != NULL) {
  462.         CMKill(pcv->windowPtr);    /* すべてのコントロールを廃棄する */
  463.         WMDispose(pcv->windowPtr); /* ウィンドウを廃棄する    */
  464.     }
  465.  
  466.     exit(code);            /* プログラムを終了する        */
  467. }
  468.  
  469. /******************************************************************************
  470.  *    exampleError():    いろいろなエラーダイアログの例
  471.  ******************************************************************************
  472.  *    引数:    ComVal *pcv    共通変数へのポインタ
  473.  */
  474. void exampleError(ComVal *pcv)
  475. {
  476.     /* メニューで選んだエラーダイアログを表示する */
  477.     switch (pcv->lastMenu) {
  478.     case 1:                /* イエローフラッグ        */
  479.         DMError(D_YELLOW | D_CONFIRM, "このファイルは実行できません。");
  480.         break;
  481.     case 2:                /* レッドフラッグ        */
  482.         DMError(D_RED | D_CONFIRM, "メモリの空き容量がありません\r"
  483.                        "ウィンドウをクローズしてください。");
  484.         break;
  485.     case 3:                /* はい/いいえ            */
  486.         DMError(D_YESNO, "指定されたファイル名が存在します。\r"
  487.                  "上書きしてもよろしいですか?");
  488.         break;
  489.     case 4:                /* 保存/終了            */
  490.         DMError(D_SAVE, "保存せずに終了しますか?");
  491.         break;
  492.     case 5:                /* 実行/取消            */
  493.         DMError(D_EXEC, "現在までの編集結果を破棄します。");
  494.         break;
  495.     case 6:                /* 継続/中止            */
  496.         DMError(D_CONT, "プリンタの準備ができていません。");
  497.         break;
  498.     case 7:                /* タスク名付き            */
  499.         TSErrDialogN(D_EXEC, " 1 個のファイルが編集されています。\r"
  500.                      "終了してよろしいですか?");
  501.         break;
  502.     }
  503. }
  504.